# 健康习惯追踪数据模型
from models import db
from datetime import datetime

class Habit(db.Model):
    """习惯模型"""
    __tablename__ = 'habits'
    
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)  # 习惯名称
    description = db.Column(db.Text)  # 描述
    icon = db.Column(db.String(50), default='📝')  # 图标
    target_count = db.Column(db.Integer, default=1)  # 每日目标次数
    unit = db.Column(db.String(20), default='次')  # 单位: 次, 杯, 分钟等
    active = db.Column(db.Boolean, default=True)  # 是否激活
    created_at = db.Column(db.DateTime, default=datetime.utcnow)  # 创建时间
    
    # 关联打卡记录
    records = db.relationship('HabitRecord', backref='habit', lazy=True, cascade='all, delete-orphan')
    
    def to_dict(self):
        """转换为字典"""
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'icon': self.icon,
            'target_count': self.target_count,
            'unit': self.unit,
            'active': self.active,
            'created_at': self.created_at.isoformat()
        }
    
    def __repr__(self):
        return f'<Habit {self.name}>'

class HabitRecord(db.Model):
    """习惯打卡记录模型"""
    __tablename__ = 'habit_records'
    
    id = db.Column(db.Integer, primary_key=True)
    habit_id = db.Column(db.Integer, db.ForeignKey('habits.id'), nullable=False)  # 关联习惯
    date = db.Column(db.Date, nullable=False, default=lambda: datetime.utcnow().date())  # 打卡日期（修复：使用lambda确保每次插入时获取当前日期）
    count = db.Column(db.Integer, default=1)  # 完成次数
    notes = db.Column(db.Text)  # 备注
    created_at = db.Column(db.DateTime, default=datetime.utcnow)  # 创建时间
    
    # 唯一约束: 每个习惯每天只能有一条记录
    __table_args__ = (db.UniqueConstraint('habit_id', 'date', name='unique_habit_date'),)
    
    def to_dict(self):
        """转换为字典"""
        return {
            'id': self.id,
            'habit_id': self.habit_id,
            'date': self.date.isoformat(),
            'count': self.count,
            'notes': self.notes,
            'created_at': self.created_at.isoformat()
        }
    
    def __repr__(self):
        return f'<HabitRecord {self.habit_id} - {self.date}>'

